# Copyright 2020 - 2022 MONAI Consortium
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#     http://www.apache.org/licenses/LICENSE-2.0
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

import torch
from torch.nn.functional import normalize
import numpy as np


class Loss(torch.nn.Module):
    def __init__(self, args):
        super().__init__()
        self.recon_loss = torch.nn.MSELoss().cuda()
        self.weight = [0.1, 0.25, 0.5, 0.75, 1.0]

    def __call__(self, x_rec0, x_rec1, x_rec2, x_rec3, x_rec4, x):
        recon_loss0 = self.recon_loss(x_rec0, x)
        recon_loss1 = self.recon_loss(x_rec1, x)
        recon_loss2 = self.recon_loss(x_rec2, x)
        recon_loss3 = self.recon_loss(x_rec3, x)
        recon_loss4 = self.recon_loss(x_rec4, x)
        loss = [recon_loss0, recon_loss1, recon_loss2, recon_loss3, recon_loss4]
        total_loss = 0.

        for i, weight in enumerate(self.weight):
            total_loss += weight * loss[i]

        return total_loss, loss


if __name__ == '__main__':
    pass